package com.wql.validate;


/**
 * 组织机构代码校验器
 * 
 * @author wuqinglong
 * @time 2013年11月7日 上午10:11:51
 * @email hellowql@126.com
 * 
 */
public class OrgCodeValidate {

	private OrgCodeValidate() {
	}

	private static final int[] C = new int[] { 3, 7, 9, 10, 5, 8, 4, 2 };

	private static final int SIZE = 11;

	private static final String CODE_REG = "[a-zA-Z0-9]{8}-?[0-9xX]";

	/**
	 * 是否是组织机构代码<br/>
	 * 公式： C9=11-MOD(∑Ci(i=1→8)×Wi,11)
	 * 
	 * @param id
	 * @return
	 */
	public static boolean valid(String no) {
		boolean result = Boolean.FALSE;
		if (isBlank(no) || !no.matches(CODE_REG)) {
			return result;
		}
		int sum = 0, w = 0;
		no = no.toUpperCase();
		byte[] sub = no.getBytes();
		for (int i = 0, j = 8; i < j; i++) {
			// 把0-1和A-Z从byte类型的转换成数值型，其中A表示10，Z表示35
			if (sub[i] >= 48 && sub[i] <= 57) {
				w = sub[i] - 48;
			} else if (sub[i] >= 65 && sub[i] <= 90) {
				w = sub[i] - 55;
			}
			sum += C[i] * w;
		}
		sum = (SIZE - sum % SIZE) % SIZE;
		final String lastStr = no.substring(no.length() - 1);
		if ("X".equals(lastStr)) {
			result = sum == 10;
		} else {
			result = sum == Integer.parseInt(lastStr);
		}
		return result;
	}

	// 是否是空的
	private static boolean isBlank(String str) {
		int strLen;
		if (str == null || (strLen = str.length()) == 0) {
			return true;
		}
		for (int i = 0; i < strLen; i++) {
			if ((Character.isWhitespace(str.charAt(i)) == false)) {
				return false;
			}
		}
		return true;
	}

}
